//
//  StatusListViewModel.swift
//  Sina
//
//  Created by maling  on 15/11/10.
//  Copyright © 2015年 maling . All rights reserved.
//

import Foundation
import SDWebImage

/// 微博数据列表视图模型 - 封装网络方法
class StatusListVeiwModel {

      /// TODO: 懒加载 - 微博数据数组 - 上拉/下拉刷新
     lazy var statusList = [StatusViewModel]()
    

    
       /// 加载网络微博数据  （数据成功后返回给控制器）
    func loadStatus(isPullup isPullup:Bool, finished: (isSuccessed: Bool) -> ()) {
    
        // 下拉刷新    取出数组中第一条微博的id
        let since_id = isPullup ? 0 :(statusList.first?.status.id ?? 0)
        // 上拉刷新 数组中最后一条微博id
        let max_id = isPullup ? (statusList.last?.status.id ?? 0) : 0
        NetworkTools.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result, error) -> () in
            // 判断加载微博数据有没有出错
            if error != nil {
                
                print("微博数据加载出错")
                finished(isSuccessed: false)
                return
            }
            
            // 执行到下面说明加载微博数据没有出错
//            print(result)
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                
                print("数据格式错误")
                finished(isSuccessed: false)
                return
            }
            // 遍历字典的数据 字典转模型
            // 1. 可变的数组
            var dataList = [StatusViewModel]()
            
            //2. 遍历数组
            for dict in array {
                
                dataList.append(StatusViewModel(status: Status(dict: dict)))
            }
            print("刷新到\(dataList.count)条微博")

            
            // 3. 测试
            // 判断是否是上拉刷新
            if max_id > 0 {
                // 上啦刷新数据拼接在后面
                self.statusList += dataList
            } else {
                // 上啦刷新数据拼接在前面
            self.statusList = dataList + self.statusList
            }
            
            // 4.完成回调
//            finished(isSuccessed: true)
            
           // 5.缓存单张图片
            self.cacheSingleImage(dataList, finished: finished)
        
     }
    }
    
    /// 缓存单张图片
    private func cacheSingleImage(dataList: [StatusViewModel], finished: (isSuccessed: Bool) -> ()) {
    
        // 1. 创建调度组
        let group = dispatch_group_create()
        // 缓存数据长度
        var dataLength = 0
        
        // 2. 遍历视图模型数组
        for vm in dataList {
        
            // 判断图片数量是否是单张图片
            if vm.thumbnailUrls?.count != 1 {
            
                continue
            }
            
            // 获取 url, 取出单张图片的地址
            let url = vm.thumbnailUrls![0]
            print("开始缓存图片\(url)")
            
            // SDWebImage - 下载图片（缓存是自动完成）
            // 入组 - 监听后续的block
            dispatch_group_enter(group)
            
            // SDWebImage - 下载图像（缓存是自动完成的）
            SDWebImageManager.sharedManager().downloadImageWithURL(url,
                options: [SDWebImageOptions.RefreshCached, SDWebImageOptions.RetryFailed],
                progress: nil,
                completed: { (image, _, _, _, _) -> Void in
                    
                    // 单张图片下载完成
                    if let img = image, let data = UIImagePNGRepresentation(img) {
                    
                        // 累加二进制数据的长度
                        dataLength += data.length
                    }
                    
                    //出组
                 dispatch_group_leave(group)
            })
        }
        
        // 3. 监听调度组完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("缓存完成\(dataLength / 1024) K")
            
            // 完成回调 - 控制器才开始刷新数据
            finished(isSuccessed: true)
        }
        
    }
    
    
    
    
}